"""
鸢尾花监督学习示例
1、不能使用用于构建模型的数据进行测试，因为模型会记住整个训练集（使用新数据，模型没有见过的数据）
2、数据使用“X”表示（矩阵），标签使用y表示（向量）
"""
from sklearn.datasets import load_iris
from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import train_test_split
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

# 加载数据
iris_dataset = load_iris()
print(f'key={iris_dataset.keys()}')

# print(f'简要说明：{iris_dataset["DESCR"]}')
print(f'特征说明：{iris_dataset["feature_names"]}')
# print(f'样本数据：\n{iris_dataset["data"][:2]}')
print(f'形状：{iris_dataset["data"].shape}')
print(f'归类标签：{iris_dataset["target_names"]}')

# 使用伪随机数生成器将数据打乱,
# 打乱标签作用：75%数据作为训练，25%数据作为测试，原始数据是按照0-2循序展示的，打乱保证每一个标签都能训练到
X_train, X_test, y_train, y_test = train_test_split(iris_dataset["data"], 
                                                    iris_dataset['target'], random_state=0)

print(f'X_train：{X_train.shape}')
print(f'y_train：{y_train.shape}')
print(f'X_test：{X_test.shape}')
print(f'y_test：{y_test.shape}')

# 图表显示打乱数据区分情况
#iris_data_frame = pd.DataFrame(X_train, columns=iris_dataset.feature_names)
#grr = pd.plotting.scatter_matrix(iris_data_frame, c=y_train, figsize=(15, 15), marker='o',
#                                 hist_kwds={'bins': 20}, s=60, alpha=0.8, cmap=plt.cm.viridis)
#plt.show()

# 构建分类模型（K近邻算法）,构建一个只有一个邻居的算法
knn = KNeighborsClassifier(n_neighbors=1)
# 训练模型
knn.fit(X_train, y_train)
# 预测模型
X_new = np.array([[5,2.9,1,0.2]])
prediction = knn.predict(X_new)

target_names = list(iris_dataset["target_names"][i] for i in prediction)
print(f'预测结果：{target_names}')
# 评估模型
#y_pred = knn.predict(X_test)
print(f'模型准确率：{np.around(knn.score(X_test, y_test), 4) * 100}%')
